import path from 'path'
import fs from 'fs'
import Busboy from 'busboy'
import { serviceConfig } from '../serviceConfig'

const dayjs = require('dayjs')

/**
 * 同步创建文件目录
 * @param  {string} dirname 目录绝对地址
 * @return {boolean}        创建目录结果
 */
function mkdirsSync(dirname: string) {
  if (fs.existsSync(dirname)) {
    return true
  } else {
    if (mkdirsSync(path.dirname(dirname))) {
      fs.mkdirSync(dirname)
      return true
    }
  }
}
/**
 * 获取上传文件的后缀名
 * @param  {string} fileName 获取上传文件的后缀名
 * @return {string}          文件后缀名
 */
function getSuffixName(fileName: string) {
  let nameList = fileName.split('.')
  return nameList[nameList.length - 1]
}
/**
 * 上传文件
 * @param  {object} ctx     koa上下文
 * @param  {object} options 文件上传参数 fileType文件类型， path文件存放路径
 * @return {promise}
 */
function uploadFile(ctx: any) {
  let req = ctx.req
  let busboy = new Busboy({ headers: req.headers })
  // console.log('文件上传中...')
  // 获取类型
  let filePath = path.join(__dirname, '../static/updateFile')
  let mkdirResult = mkdirsSync(filePath)
  return new Promise((resolve, reject) => {
    let result = {
      status: false,
      msg: '',
      path: '',
    }

    // 解析请求文件事件
    busboy.on('file', function (_fieldname, file, filename) {
      let fileName = `${dayjs().format(
        'YYYY_MM_DD_HH_mm_ss'
      )}_${Math.random().toString(16).substr(2, 6)}.${getSuffixName(filename)}`
      let saveTo = path.join(filePath, fileName)
      // 文件保存到制定路径
      file.pipe(fs.createWriteStream(saveTo))
      // 文件写入事件结束
      file.on('end', function () {
        result = {
          status:true,
          msg:'文件上传成功',
          path:`${serviceConfig.domainName}:${serviceConfig.localhost}/updateFile/${fileName}`
        }
        resolve(result) 
      })
    })
    // 解析结束事件
    // busboy.on('finish', function () {
    //   // resolve(result)
    // })

    // 解析错误事件
    busboy.on('error', function () {
      console.log('文件上出错')
      reject(result)
    })

    req.pipe(busboy)
  })
}
export default uploadFile
